/**
 * @Author: Gosin
 * @Date: 2020/1/9 16:05
 */
package controller

import (
	"encoding/json"
	"git.900sui.cn/kc/base/common/functions"
	"git.900sui.cn/kc/base/utils"
	"git.900sui.cn/kc/rpcinterface/client/pay"
	"git.900sui.cn/kc/rpcinterface/interface/order"
	pay2 "git.900sui.cn/kc/rpcinterface/interface/pay"
	"github.com/gin-gonic/gin"
	"net/http"
	"strings"
)

type NotifyController struct {
	functions.Controller
}

// 建行支付回调
func (n *NotifyController) Ccb() {
	data := ""
	if len(n.Ctx.Request.PostForm) > 0 {
		postData := map[string]string{}
		for key, value := range n.Ctx.Request.PostForm {
			postData[key] = value[0]
		}
		data = n.Ctx.Request.PostForm.Encode()
		utils.Logerr.Printf("建行支付回调数据，data:%s", n.Ctx.Request.PostForm.Encode())
	} else {
		dataByte, _ := n.Ctx.GetRawData()
		data = string(dataByte)
	}
	utils.Logerr.Printf("建行支付回调数据，data:%s", data)
	if len(data) == 0 {
		n.Ctx.String(500, "respCode=999999")
		return
	}
	rpcPay := new(pay.Pay).Init()
	result := false
	if err := rpcPay.Notify(n.Ctx, &pay2.ArgsNotify{
		PayChannel: order.PAY_CHANNEL_ccb,
		Data:       string(data),
	}, &result); err != nil {
		utils.Logerr.Printf("建行支付回调错误，err:%v", err)
		n.Ctx.JSON(500, gin.H{
			"respCode": "999999",
		})
		return
	}
	utils.Logerr.Printf("建行支付回调成功")
	n.Ctx.JSON(200, gin.H{
		"respCode": "000000",
	})
}

// 杉德支付回调
func (n *NotifyController) Sandpay() {
	data := ""
	if len(n.Ctx.Request.PostForm) > 0 {
		data = n.Ctx.Request.PostForm.Encode()
		utils.Logerr.Printf("杉德支付回调数据，data:%s", n.Ctx.Request.PostForm.Encode())
	} else {
		dataByte, _ := n.Ctx.GetRawData()
		data = string(dataByte)
	}
	utils.Logerr.Printf("杉德支付回调数据，data:%s", data)
	if len(data) == 0 {
		n.Ctx.String(500, "respCode=999999")
		return
	}
	rpcPay := new(pay.Pay).Init()
	result := false
	if err := rpcPay.Notify(n.Ctx, &pay2.ArgsNotify{
		PayChannel: order.PAY_CHANNEL_sand,
		Data:       data,
	}, &result); err != nil {
		utils.Logerr.Printf("杉德支付回调错误，err:%v", err)
		n.Ctx.String(500, "respCode=999999")
		return
	}
	utils.Logerr.Printf("杉德支付回调成功")
	n.Ctx.String(200, "respCode=000000")
}

// 平安银行支付异步回调-上海地区
func (n *NotifyController) PinganPayForSH() {
	data := ""
	if len(n.Ctx.Request.PostForm) > 0 {
		maps := map[string]interface{}{}
		data1 := n.Ctx.Request.PostForm
		if len(data1) > 0 {
			for k, m := range data1 {
				maps[k] = m[0]
			}
		}
		dataBytes, _ := json.Marshal(maps)
		data = string(dataBytes)
		utils.Logerr.Printf("平安银行支付回调数据，data:%s", data)
	} else {
		dataByte, _ := n.Ctx.GetRawData()
		data = string(dataByte)
	}
	utils.Logerr.Printf("平安银行支付回调数据，data:%s", data)
	if len(data) == 0 {
		n.Ctx.String(500, "notify_fail")
		return
	}
	var maps map[string]interface{}
	if err := json.Unmarshal([]byte(data), &maps); err != nil {
		n.Ctx.String(500, err.Error())
		return
	}
	//新增两个字段
	maps["channelArea"] = 321       //区域
	maps["channelPay"] = "PINANPAY" //支付渠道
	dataBytes, _ := json.Marshal(maps)
	data = string(dataBytes[:])
	//\\//新增两个字段
	rpcPay := new(pay.Pay).Init()
	result := false
	if err := rpcPay.Notify(n.Ctx, &pay2.ArgsNotify{
		PayChannel: order.PAY_CHANNEL_pingan,
		Data:       data,
	}, &result); err != nil {
		utils.Logerr.Printf("平安银行支付错误，err:%v", err)
		n.Ctx.String(500, "notify_fail")
		return
	}
	utils.Logerr.Printf("平安银行回调成功")
	n.Ctx.String(200, "notify_success")
}

// 平安银行-微信直连异步回调-上海地区
func (n *NotifyController) PinganWXForSH() {
	bodyByte, _ := n.Ctx.GetRawData()
	body := string(bodyByte)
	utils.Logerr.Printf("平安银行-微信直连支付回调body:data:%s", body)
	if len(body) == 0 {
		n.Ctx.String(500, "notify_fail")
		return
	}
	headerMap := map[string]string{
		"Wechatpay-Serial":    strings.TrimSpace(n.Input.Header("Wechatpay-Serial").String()),
		"Wechatpay-Timestamp": strings.TrimSpace(n.Input.Header("Wechatpay-Timestamp").String()),
		"Wechatpay-Nonce":     strings.TrimSpace(n.Input.Header("Wechatpay-Nonce").String()),
		"Wechatpay-Signature": strings.TrimSpace(n.Input.Header("Wechatpay-Signature").String()),
	}
	header, _ := json.Marshal(headerMap)
	utils.Logerr.Printf("平安银行-微信直连支付回调header:data:%s", string(header))

	maps := make(map[string]interface{})
	maps["body"] = body
	maps["header"] = string(header)
	//新增两个字段
	maps["channelArea"] = 321    //区域
	maps["channelPay"] = "WXPAY" //支付渠道

	dataBytes, _ := json.Marshal(maps)
	data := string(dataBytes[:])
	rpcPay := new(pay.Pay).Init()
	result := false
	if err := rpcPay.Notify(n.Ctx, &pay2.ArgsNotify{
		PayChannel: order.PAY_CHANNEL_pingan,
		Data:       data,
	}, &result); err != nil {
		utils.Logerr.Printf("平安银行-微信直联支付回调错误，err:%v", err)
		n.Ctx.String(500, "notify_fail")
		return
	}
	utils.Logerr.Printf("平安银行-微信直联支付回调成功")
	n.Ctx.JSON(200, gin.H{
		"code":    "SUCCESS",
		"message": "成功",
	})
}

// 平安银行-支付宝直连异步回调-上海地区
func (n *NotifyController) PinganALIForSH() {
	maps := map[string]interface{}{}
	if len(n.Ctx.Request.PostForm) > 0 {
		data1 := n.Ctx.Request.PostForm
		if len(data1) > 0 {
			for k, m := range data1 {
				maps[k] = m[0]
			}
		}
		dataBytes, _ := json.Marshal(maps)
		utils.Logerr.Printf("平安银行-支付宝直连支付回调数据，data:%s", string(dataBytes))
	}
	if len(maps) == 0 {
		n.Ctx.String(500, "fail")
		return
	}
	//新增两个字段
	maps["channelArea"] = 321     //区域
	maps["channelPay"] = "ALIPAY" //支付渠道
	dataBytes, _ := json.Marshal(maps)
	data := string(dataBytes[:])
	//\\//新增两个字段
	rpcPay := new(pay.Pay).Init()
	result := false
	if err := rpcPay.Notify(n.Ctx, &pay2.ArgsNotify{
		PayChannel: order.PAY_CHANNEL_pingan,
		Data:       data,
	}, &result); err != nil {
		utils.Logerr.Printf("平安银行-支付宝直连支付错误，err:%v", err)
		n.Ctx.String(500, "notify_fail")
		return
	}
	utils.Logerr.Printf("平安银行-支付宝直连支付回调成功")
	n.Ctx.String(200, "success")
}

//新大陆支付异步回调 杭州地区
func (n *NotifyController) Xindapay() {
	bodyByte, _ := n.Ctx.GetRawData()
	body := string(bodyByte)
	utils.Logerr.Printf("新大陆-杭州银行统一下单异步回调body:data:%s", body)
	if len(body) == 0 {
		n.Ctx.String(http.StatusInternalServerError, "notify_fail")
		return
	}

	maps := make(map[string]interface{})

	if err := json.Unmarshal([]byte(body), &maps); err != nil {
		n.Ctx.String(http.StatusInternalServerError, err.Error())
		return
	}
	//新增两个字段
	maps["channelArea"] = 383         //区域
	maps["channelPay"] = "XINDALUPAY" //支付渠道 交易类型（0.银联B扫C 1.支付宝B扫C 2.微信B扫C 3.银联C扫B 5.公众号支付 7.支付宝C扫B 8.小程序交易）

	dataBytes, _ := json.Marshal(maps)

	data := string(dataBytes[:])

	rpcXindaPay := new(pay.Pay).Init()
	defer rpcXindaPay.Close()
	result := false

	if err := rpcXindaPay.Notify(n.Ctx, &pay2.ArgsNotify{
		PayChannel: order.PAY_CHANNEL_xindalu,
		Data:       data,
	}, &result); err != nil {
		utils.Logerr.Printf("新大陆-杭州银行 统一下单支付回调错误:%v", err)
		n.Ctx.String(http.StatusInternalServerError, "notify_fail")
		return
	}
	//返回值必带：{"rspCod":"","rspMsg":"success"}
	//接收成功时，请务必带上"rspMsg":"success"，否则平台将一直发送该条通知，直到超过15分钟后就不再发送。
	utils.Logerr.Printf("新大陆-杭州银行 统一下单支付回调成功")
	utils.Logerr.Printf("新大陆-杭州银行 下单结果: %v", result)
	n.Ctx.JSON(http.StatusOK, gin.H{
		"rspCod": "",
		"rspMsg": "success",
	})
}

// 平安银行支付异步回调-杭州
func (n *NotifyController) PinganPayForHZ() {
	data := ""
	if len(n.Ctx.Request.PostForm) > 0 {
		maps := map[string]interface{}{}
		data1 := n.Ctx.Request.PostForm
		if len(data1) > 0 {
			for k, m := range data1 {
				maps[k] = m[0]
			}
		}
		dataBytes, _ := json.Marshal(maps)
		data = string(dataBytes)
		utils.Logerr.Printf("平安银行杭州支付回调数据，data:%s", data)
	} else {
		dataByte, _ := n.Ctx.GetRawData()
		data = string(dataByte)
	}
	utils.Logerr.Printf("平安银行杭州支付回调数据，data:%s", data)
	if len(data) == 0 {
		n.Ctx.String(500, "notify_fail")
		return
	}
	var maps map[string]interface{}
	if err := json.Unmarshal([]byte(data), &maps); err != nil {
		n.Ctx.String(500, err.Error())
		return
	}
	//新增两个字段
	maps["channelArea"] = 383       //区域
	maps["channelPay"] = "PINANPAY" //支付渠道
	dataBytes, _ := json.Marshal(maps)
	data = string(dataBytes[:])
	//\\//新增两个字段
	rpcPay := new(pay.Pay).Init()
	result := false
	if err := rpcPay.Notify(n.Ctx, &pay2.ArgsNotify{
		PayChannel: order.PAY_CHANNEL_pingan,
		Data:       data,
	}, &result); err != nil {
		utils.Logerr.Printf("平安银行支付错误，err:%v", err)
		n.Ctx.String(500, "notify_fail")
		return
	}
	utils.Logerr.Printf("平安银行回调成功")
	n.Ctx.String(200, "notify_success")
}

// 平安银行-微信直连异步回调-杭州区域
func (n *NotifyController) PinganWXForHZ() {
	bodyByte, _ := n.Ctx.GetRawData()
	body := string(bodyByte)
	utils.Logerr.Printf("平安银行杭州-微信直连支付回调body:data:%s", body)
	if len(body) == 0 {
		n.Ctx.String(500, "notify_fail")
		return
	}
	headerMap := map[string]string{
		"Wechatpay-Serial":    strings.TrimSpace(n.Input.Header("Wechatpay-Serial").String()),
		"Wechatpay-Timestamp": strings.TrimSpace(n.Input.Header("Wechatpay-Timestamp").String()),
		"Wechatpay-Nonce":     strings.TrimSpace(n.Input.Header("Wechatpay-Nonce").String()),
		"Wechatpay-Signature": strings.TrimSpace(n.Input.Header("Wechatpay-Signature").String()),
	}
	header, _ := json.Marshal(headerMap)
	utils.Logerr.Printf("平安银行杭州-微信直连支付回调header:data:%s", string(header))

	maps := make(map[string]interface{})
	maps["body"] = body
	maps["header"] = string(header)
	//新增两个字段
	maps["channelArea"] = 383    //区域
	maps["channelPay"] = "WXPAY" //支付渠道

	dataBytes, _ := json.Marshal(maps)
	data := string(dataBytes[:])
	rpcPay := new(pay.Pay).Init()
	result := false
	if err := rpcPay.Notify(n.Ctx, &pay2.ArgsNotify{
		PayChannel: order.PAY_CHANNEL_pingan,
		Data:       data,
	}, &result); err != nil {
		utils.Logerr.Printf("平安银行杭州-微信直联支付回调错误，err:%v", err)
		n.Ctx.String(500, "notify_fail")
		return
	}
	utils.Logerr.Printf("平安银行杭州-微信直联支付回调成功")
	n.Ctx.JSON(200, gin.H{
		"code":    "SUCCESS",
		"message": "成功",
	})
}

// 平安银行-支付宝直连异步回调-杭州区域
func (n *NotifyController) PinganALIForHZ() {
	maps := map[string]interface{}{}
	if len(n.Ctx.Request.PostForm) > 0 {
		data1 := n.Ctx.Request.PostForm
		if len(data1) > 0 {
			for k, m := range data1 {
				maps[k] = m[0]
			}
		}
		dataBytes, _ := json.Marshal(maps)
		utils.Logerr.Printf("平安银行杭州-支付宝直连支付回调数据，data:%s", string(dataBytes))
	}
	if len(maps) == 0 {
		n.Ctx.String(500, "fail")
		return
	}
	//新增两个字段
	maps["channelArea"] = 383     //区域
	maps["channelPay"] = "ALIPAY" //支付渠道
	dataBytes, _ := json.Marshal(maps)
	data := string(dataBytes[:])
	//\\//新增两个字段
	rpcPay := new(pay.Pay).Init()
	result := false
	if err := rpcPay.Notify(n.Ctx, &pay2.ArgsNotify{
		PayChannel: order.PAY_CHANNEL_pingan,
		Data:       data,
	}, &result); err != nil {
		utils.Logerr.Printf("平安银行杭州-支付宝直连支付错误，err:%v", err)
		n.Ctx.String(500, "notify_fail")
		return
	}
	utils.Logerr.Printf("平安银行杭州-支付宝直连支付回调成功")
	n.Ctx.String(200, "success")
}

// 工行支付异步回调
/*func (n *NotifyController) Icbcpay() {
	data := ""
	if len(n.Ctx.Request.PostForm) > 0 {
		data = n.Ctx.Request.PostForm.Encode()
	} else {
		dataByte, _ := n.Ctx.GetRawData()
		data = string(dataByte)
	}
	utils.Logerr.Printf("工行支付回调数据，data:%s", data)
	rpcPay := new(pay.Pay).Init()
	argsNotify := &pay2.ArgsNotify{
		PayChannel: order.PAY_CHANNEL_icbc,
		Data:       data,
	}
	//回调通知
	var replyNotifyResponse pay2.ReplyNotifyResponse
	var nre NotifyRes
	if err := rpcPay.NotifyResponse(n.Ctx, argsNotify, &replyNotifyResponse); err != nil {
		_=json.Unmarshal([]byte(replyNotifyResponse.ResponseJsonStr),&nre)
		n.Ctx.JSON(200, nre)
		return
	}
	_=json.Unmarshal([]byte(replyNotifyResponse.ResponseJsonStr),&nre)

	if nre.ResponseBizContent.ReturnCode==0 && nre.ResponseBizContent.ReturnMsg!=""{
		result := false
		if err := rpcPay.Notify(n.Ctx, argsNotify, &result); err != nil {
			utils.Logerr.Printf("工行支付回调错误，err:%v", err)
		}
	}
	utils.Logerr.Printf("工行支付回调成功")
	n.Ctx.JSON(200,nre)
}*/

type NotifyRes struct {
	ResponseBizContent resBizContent `json:"response_biz_content"`
	SignType           string        `json:"sign_type"`
	Sign               string        `json:"sign"`
}
type resBizContent struct {
	ReturnCode int    `json:"return_code"`
	ReturnMsg  string `json:"return_msg"`
	MsgId      string `json:"msg_id"`
}
